iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
自我挑戰組

JS 加強筆記系列 第 22

Day 22:async/ await (2)

  • 分享至 

  • xImage
  •  

錯誤處理

如果 await 的 promise 失敗,會丟出錯誤,類似 throw new Error 的效果:

async function f1() {
    await Promise.reject(new Error("Whoops!"));
}

// 等同於

async function f2() {
    throw new Error("Whoops!");
}

錯誤處理也可以像同步任務使用 try...catch

async function f() {
    try {
        let response = await fetch('/no-user-here');
        let user = await response.json();
    } catch(err) {
        console.log(err);
    }
}

f();

如果沒有 try...catchasync 函式產生的 promise 狀態會變成 rejected,此時也可以在函式上加上 .catch 處理 (如下),不加的話就會出現 uncaught error。通常使用 async/ await 後就不太需要 .then/ .catch,但當例如在函式外面、語法上不允許使用 await 時,.then/ .catch 也是一種選擇。

async function f() {
  let response = await fetch('http://no-such-url');
}

f().catch(alert); // TypeError: failed to fetch 

補充

async function loadJson(url) {
    let response = await fetch(url);

    if (response.status == 200) {
        let json = await response.json(); // (5)
        return json;
    }

    throw new Error(response.status);
}

loadJson('https://javascript.info/no-such-user.json')
    .catch(alert); // Error: 404

教學中寫到這段範例的第 5 行「也可以直接寫 return response.json();,但在外面的程式碼就需要 await 結果」。雖然這段只是寫法練習沒有太多情境,但如果是要回傳 JSON 到 loadJson 外面使用,以現在第 5、6 行的寫法函式外也是需要 await 結果,因為函式無論如何都會回傳 promise。所以原則應該是有需要等待結果的地方都要加上 await,這部分可能會因為太像在寫同步程式碼而忘記。


上一篇
Day 21:async/ await (1)
下一篇
Day 23:promise 實作 (1)
系列文
JS 加強筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言